home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
COMM
/
BRC_ASP1.ARJ
/
ZIPDIR.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-01-29
|
4KB
|
120 lines
(* Atkinson - Home Computer - 414-543-8929 - ZIP-KIT *)
{$a+,b-,d+,e-,f-,i-,l+,n-,o-,r-,s-,v-}
{$m 16384,100000,100000}
unit zipdir;
interface
uses dos, strings;
procedure ZipDirSetup (var ZipFileName : string; var ZipDirStatus: integer);
procedure ZipDirFetch (var ZipDirItem : string; var ZipDirStatus: integer);
implementation
type
buftype = array [0..20480] of byte;
local_header = record
case a_signature : longint of
$04034b50 : ( a_extract_version_reqd : word;
a_bit_flag : word;
a_compress_method : word;
a_last_mod_time : word;
a_last_mod_date : word;
a_crc32 : longint;
a_compressed_size : longint;
a_uncompressed_size : longint;
a_filename_length : word;
a_extra_field_length : word);
$04034b50 : ( dum1 : array[0..2] of word;
dum_date : longint);
end;
var
f1 : file;
result : word;
work1 : local_header;
buffer : buftype;
loop1 : integer;
loop2 : integer;
size : integer;
remainder : integer;
zipfile : string;
zipdate : dos.datetime;
uncmp_tot : longint;
procedure ZipDirSetup (var ZipFileName : string; var ZipDirStatus: integer);
begin
uncmp_tot := 0;
zipfile := ZipFileName;
if (zipfile = '') or
((0 = pos('.ZIP',zipfile)) and
(0 = pos('.zip',zipfile)))
then begin
ZipDirStatus := 98;
exit;
end;
assign(f1,zipfile);
{$I-} reset(f1,1); {$I+}
ZipDirStatus := ioresult;
if 0 = ioresult
then blockread(f1,work1,30,result);
end;
procedure ZipDirFetch (var ZipDirItem : string; var ZipDirStatus: integer);
begin
if work1.a_signature = $02014b50
then begin
ZipDirItem := '';
ZipDirStatus := 99;
close(f1);
exit;
end;
ZipDirItem := '';
size := work1.a_compressed_size div 20480;
remainder := work1.a_compressed_size mod 20480;
uncmp_tot := uncmp_tot + work1.a_uncompressed_size;
blockread (f1,buffer,work1.a_filename_length+work1.a_extra_field_length,
result);
ZipDirItem := ZipDirItem + ZStr (work1.a_compressed_size,7)
+ ZStr (work1.a_uncompressed_size,7);
case lo (work1.a_compress_method) of
0 : ZipDirItem := ZipDirItem + ' stored ';
1 : ZipDirItem := ZipDirItem + ' shrunk ';
2..5 : ZipDirItem := ZipDirItem + ' reduce '
+ ZStr (lo(work1.a_compress_method)-1,1);
6 : ZipDirItem := ZipDirItem + ' imploded ';
8 : ZipDirItem := ZipDirItem + ' A-Xtra ';
else
ZipDirItem := ZipDirItem + ' unknown ';
end;
if work1.a_uncompressed_size < 1 then work1.a_uncompressed_size := 1;
ZipDirItem := ZipDirItem + ZStr (trunc((work1.a_compressed_size /
work1.a_uncompressed_size -1) * -100 + 5e-1),2) + '%';
unpacktime (work1.dum_date,zipdate);
ZipDirItem := ZipDirItem + ' '
+ FStr (zipdate.month,2) + '-'
+ FStr (zipdate.day,2) + '-'
+ FStr (zipdate.year,4) + ' '
+ FStr (zipdate.hour,2) + ':'
+ FStr (zipdate.min,2) + ':'
+ FStr (zipdate.sec,2) + ' ';
for loop1 := 0 to work1.a_filename_length-1 do
ZipDirItem := ZipDirItem + (char (buffer [loop1]));
if size > 0
then begin
for loop1 := 1 to size do
blockread (f1,buffer,20480,result);
end;
if remainder > 0
then blockread (f1,buffer,remainder,result);
blockread (f1,work1,30,result);
end;
end.